// 控制器函数通常负责解析请求数据，调用相应的服务函数处理业务逻辑，并返回响应给客户端。
package controllers

// 导入必要的包以支持控制器函数的编写和数据库操作。
import (
	// 导入services包以访问业务逻辑服务。
	"PublicBenefitActivities/services"
	// 导入utils包以使用辅助工具函数。
	"PublicBenefitActivities/utils"

	// 导入gin框架以构建路由和处理HTTP请求。
	"github.com/gin-gonic/gin"
	// 导入gorm以操作数据库。
	"gorm.io/gorm"
)

// 用于处理获取所有用户信息的请求。
// 该函数通过调用 services.GetAllUsers 方法从数据库中获取用户数据，并将结果以 JSON 格式返回。
// 参数:
//
//	c *gin.Context: HTTP 请求的上下文，用于读取请求和写入响应。
//	db *gorm.DB: 数据库连接对象，用于与数据库进行交互。
func GetUsers(c *gin.Context, db *gorm.DB) {
	// 调用 services.GetAllUsers 方法获取所有用户数据。
	users, err := services.GetAllUsers(db)
	// 如果获取数据过程中发生错误，返回 500 错误码及 "Database error" 提示信息。
	if err != nil {
		utils.Error(c, 500, "Database error")
		return
	}
	// 如果成功获取数据，返回 200 状态码及用户数据。
	utils.Success(c, users)
}

// WxLogin 微信登录接口
// 该函数接收一个 *gin.Context 参数，用于处理 HTTP 请求和响应
// 它通过前端传入的 code 参数，与微信服务器交互，以完成用户的登录过程
func WxLogin(c *gin.Context) {
	// 定义一个结构体来存储从前端接收到的登录数据，包括微信登录所需的 code
	var loginData struct {
		Code string `json:"code"`
	}

	// 使用 c.ShouldBind 方法将前端传入的 JSON 数据绑定到 loginData 结构体
	// 如果绑定失败，返回错误信息，并终止函数执行
	if err := c.ShouldBind(&loginData); err != nil {
		utils.Error(c, 500, "前端传递参数绑定失败")
		return
	}

	// 调用 utils.GetWechatUserInfo 函数，通过 loginData.Code 获取微信用户信息
	// 如果获取失败，返回错误信息，并终止函数执行
	wxRes, err := services.GetUserOpenId(loginData.Code)
	if err != nil {
		utils.Error(c, 500, "微信登录失败")
		return
	}

	// // 调用 dao.UserLoginDao 函数，使用从微信获取的用户信息进行本地登录逻辑处理
	// // 如果本地登录失败，返回错误信息，并终止函数执行
	// if err := dao.UserLoginDao(wxRes); err != nil {
	// 	utils.Error(c, "本地登录失败")
	// 	return
	// }

	// 如果登录成功，返回成功响应，包括用户的 openId 和 sessionKey
	response := gin.H{
		"message":    "登录成功",
		"openId":     wxRes.OpenID,
		"sessionKey": wxRes.SessionKey,
	}
	utils.Success(c, response)
}
